home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 1
/
CU Amiga Magazine CD-ROM Special Edition (1995)(EMAP Images)(GB)[Issue 1995-11].iso
/
Aminet
/
misc
/
emu
/
prlink_amiga.lha
/
prlink-0.8.0a
/
src
/
prtrans4.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-06
|
3KB
|
167 lines
#ifdef __linux__
#include <unistd.h>
#include <asm/io.h>
#endif __linux__
#include "prtrans.h"
unsigned baseaddr, stataddr;
int prinit (void) {
#ifdef __linux__
if (ioperm (baseaddr, 2, 1))
return -1;
#endif /* __linux__ */
outb(128, baseaddr); /* set the -FLAG signal to high */
stataddr = baseaddr + 1;
return 0;
}
void prclose (void) {
}
void output (unsigned char byte) {
send (&byte, 1);
}
unsigned input (void) {
unsigned char byte;
receive (&byte, 1);
return byte;
}
unsigned wait_input (void) {
register unsigned char data;
outb(0, baseaddr);
while (!(128 & inb(stataddr)))
usleep (SLEEP_TIME); /* wait between each try */
outb(128, baseaddr);
data = (inb(stataddr) & 0x78) >> 3;
outb(0, baseaddr);
while (128 & inb(stataddr));
data |= (inb(stataddr) & 0x78) << 1;
outb(128, baseaddr);
return data;
}
#if !defined(__i386__) && !defined(__GNU_C__)
void send (unsigned char *buffer, unsigned length) {
register unsigned char byte;
while (length--) {
byte = *buffer++;
outb(byte & 0x0f, baseaddr);
while (!(128 & inb(stataddr)));
outb(128, baseaddr);
outb(byte >> 4, baseaddr);
while (128 & inb(stataddr));
outb(128, baseaddr);
}
}
#else /* __i386__ && __GNU_C__ */
void send (unsigned char *buffer, unsigned length) {
asm ("push %%ebp
movw _baseaddr,%%dx
movl %1,%%ecx
movl %0,%%ebp
sloop: movb (%%ebp),%%al
andb $0x0f,%%al
outb %%al,%%dx
incw %%dx
ewait: inb %%dx,%%al
testb $0x80,%%al
jz ewait
decw %%dx
movb $0x80,%%al
outb %%al,%%dx
movb (%%ebp),%%al
shrb $4,%%al
outb %%al,%%dx
incw %%dx
zwait: inb %%dx,%%al
testb $0x80,%%al
jnz zwait
decw %%dx
movb $0x80,%%al
outb %%al,%%dx
inc %%ebp
loop sloop
pop %%ebp"
: /* no outputs */
: "g" (buffer), "g" (length)
: "ax", "ecx", "dx");
}
#endif /* __i386__ && __GNU_C__ */
#if !defined(__i386__) && !defined(__GNU_C__)
void receive (unsigned char *buffer, unsigned length) {
register unsigned char data;
while (length--) {
outb(0, baseaddr);
while (!(128 & inb(stataddr)));
outb(128, baseaddr);
data = (inb(stataddr) & 0x78) >> 3;
outb(0, baseaddr);
while (128 & inb(stataddr));
*buffer++ = data | ((inb(stataddr) & 0x78) << 1);
outb(128, baseaddr);
}
}
#else /* __i386__ && __GNU_C__ */
void receive (unsigned char *buffer, unsigned length) {
asm ("push %%ebp
movw _baseaddr,%%dx
movl %1,%%ecx
movl %0,%%ebp
rloop: xorb %%al,%%al
outb %%al,%%dx
incw %%dx
dwait: inb %%dx,%%al
testb $0x80,%%al
jz dwait
andb $0x78,%%al
shrb $3,%%al
movb %%al,(%%ebp)
decw %%dx
movb $0x80,%%al
outb %%al,%%dx
xorb %%al,%%al
outb %%al,%%dx
incw %%dx
vwait: inb %%dx,%%al
testb $0x80,%%al
jnz vwait
andb $0x78,%%al
shlb $1,%%al
orb %%al,(%%ebp)
decw %%dx
movb $0x80,%%al
outb %%al,%%dx
inc %%ebp
loop rloop
pop %%ebp"
: /* no outputs */
: "g" (buffer), "g" (length)
: "ax", "ecx", "dx");
}
#endif /* __i386__ && __GNU_C__ */